map 映射
C++ 中 map 提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第一个值称之为关键字(key),每个关键字只能在 map 中出现一次;第二个称之为该关键字的对应值。
map 图解
语法格式
map<string , int> my_map;
创建一个 map,名字叫做 my_map;
需要头文件 map
常用函数
添加元素
- 用 insert 函数插入 pair 数据
cpp
map<int,string> my_map;
my_map.insert(pair<int,string>(1,"first"));
my_map.insert(pair<int,string>(2,"second"));
- insert 函数插入 value_type 数据
cpp
map<int,string> my_map;
my_map.insert(map<int,string>:: value_type(3,"third"));
- 用数组方式插入数据
cpp
map<int,string> my_map;
my_map[4] = "fourth";
遍历 map
- 迭代器形式遍历 map
迭代器形式遍历 map 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<int,string> my_map;
my_map.insert(pair<int,string>(1,"first"));
my_map.insert(pair<int,string>(2,"second"));
my_map.insert(map<int,string>:: value_type(3,"third"));
my_map[4] = "fourth";
//产生一个指向map开头的迭代器 it
map<int,string>::iterator it;
for(it=my_map.begin();it!=my_map.end();it++){
cout << it->first<< ' ' ;
cout << it->second << endl;
}
return 0;
}
运行结果:
c
1 first
2 second
3 third
4 fourth
分析
pair 的第一个成员变量用 first,第二个成员变量是 second。
map 中查找元素:
find() 函数返回一个迭代器指向键值为 key 的元素,如果没找到就返回指向 map 尾部的迭代器。
map 中查到元素的情况 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<int,string> my_map;
my_map.insert(pair<int,string>(1,"first"));
my_map.insert(pair<int,string>(2,"second"));
my_map.insert(map<int,string>:: value_type(3,"third"));
my_map[4] = "fourth";
map<int,string>:: iterator it;
it = my_map.find(3);
if(it == my_map.end()){
cout << "没有找到3" << endl;
}else{
cout << "有数字3" << endl;
}
return 0;
}
运行结果:
c
有数字3
分析
map 中的确是数字 3,所以 it == my_map.end()不成立
map 中查不到元素的情况 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<int,string> my_map;
my_map.insert(pair<int,string>(1,"first"));
my_map.insert(pair<int,string>(2,"second"));
my_map.insert(map<int,string>:: value_type(3,"third"));
my_map[4] = "fourth";
map<int,string>:: iterator it;
it = my_map.find(10);
if(it == my_map.end()){
cout << "没有找到10" << endl;
}else{
cout << "有数字10" << endl;
}
return 0;
}
运行结果:
c
没有找到10
分析
map 中没有数字 10,此时 find()函数的返回值 是 指向 map 尾部的迭代器 end,
即 it == my_map.end()成立,打印“没有找到 10”。
map 中删除元素:
- 删除给定迭代器指定的那个位置
map.erase(position)
需要注意,返回值指向被删除元素的下一个元素的迭代器
删除给定迭代器指定的那个位置 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<int,string> my_map;
my_map.insert(pair<int,string>(1,"first"));
my_map.insert(pair<int,string>(2,"second"));
my_map.insert(map<int,string>:: value_type(3,"third"));
my_map[4] = "fourth";
map<int,string>:: iterator it ;
cout << "删除之前的map:" << endl;
for(it=my_map.begin();it!=my_map.end();it++){
cout << it->first<< ' ' ;
cout << it->second << endl;
}
for(it=my_map.begin();it!=my_map.end();){
if(it->second == "first"){
my_map.erase(it++); //返回值指向被删除元素的下一个元素的迭代器
}else{
it++;
}
}
cout << "删除之后的map:" << endl;
for(it=my_map.begin();it!=my_map.end();it++){
cout << it->first<< ' ' ;
cout << it->second << endl;
}
return 0;
}
运行结果:
c
删除之前的map:
1 first
2 second
3 third
4 fourth
删除之后的map:
2 second
3 third
4 fourth
分析
在使用 for 进行查找的过程中,一旦进行 erase 的时候,一定要注意好需要 it++,
- 通过关键字删除
size_type erase(const Key&key);
删除关键字删除 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<int,string> my_map;
my_map.insert(pair<int,string>(1,"first"));
my_map.insert(pair<int,string>(2,"second"));
my_map.insert(map<int,string>:: value_type(3,"third"));
my_map[4] = "fourth";
map<int,string>:: iterator it ;
cout << "删除之前的map:" << endl;
for(it=my_map.begin();it!=my_map.end();it++){
cout << it->first<< ' ' ;
cout << it->second << endl;
}
//删除关键字1和3
my_map.erase(1);
my_map.erase(3);
cout << "删除之后的map:" << endl;
for(it=my_map.begin();it!=my_map.end();it++){
cout << it->first<< ' ' ;
cout << it->second << endl;
}
return 0;
}
运行结果:
c
删除之前的map:
1 first
2 second
3 third
4 fourth
删除之后的map:
2 second
4 fourth
分析
通过关键字删除,其实也是有返回值的,如果删除了会返回 1,否则返回 0。
排序
map 中元素是自动按 key 升序排序(从小到大)的;
排序 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<int,string> my_map;
my_map.insert(pair<int,string>(1,"first"));
my_map.insert(pair<int,string>(4,"second"));
my_map.insert(map<int,string>:: value_type(2,"third"));
my_map[6] = "fourth";
map<int,string>:: iterator it ;
for(it=my_map.begin();it!=my_map.end();it++){
cout << it->first<< ' ';
cout << it->second << endl;
}
return 0;
}
运行结果:
c
1 first
2 third
4 second
6 fourth
分析
赋值的时候键值是乱序给的,但是输出的时候是按照 key 升序输出的。
建议
按照 value 排序时,想直接使用 sort 函数是做不到的,sort 函数只支持数组、vector、list、queue 等的排序,无法对 map 排序, 如果想要排序,可以把 map 放在 vector 中,再对 vector 进行排序。
map 函数列表
函数 | 描述 |
---|---|
at(index) | 读取 map 指定索引 index 的元素的值。 |
begin() | map 的第一个元素的地址。 |
end() | map 的最后一个元素的下一个地址。 |
size() | map 中元素的数量。 |
erase(key) | 删除 map 指定 key 的元素。 |
clear() | 清空 map。 |
empty() | 检查 map 是否为空。 |
find(key) | 查找 map 中的键值为 key 的元素,如果不存在,返回 end()。 |